#include <iostream>
#include "lista.h"

#include <stdlib.h>


void DesplegaMenu(){
    printf("\n\nMenu:");
    printf("\n1- Buscar un elemento en la Lista       7- Minimo elemento");
    printf("\n2- Sustituir un elemento en la Lista    8- Elemento de la posicion n");
    printf("\n3- Iguales?                             9- Borrar elemento Iterativamente");
    printf("\n4- Interseccion de 2 listas             10- Borrar elemento Recursivamente");
    printf("\n5- Suma elementos en posiciones Pares   11- Primeros n elementos Iter");
    printf("\n6- Recargar Primera Lista               12- Salir");
}

void PressEnter(){
    char tecla;
    fflush(stdin);
    printf("\n\n\n                    Presione 'Enter' para continuar");
    scanf("%c", &tecla);
    fflush(stdin);
}

int Ingreso(){
int num;
    printf("\nIngrese num: ");
    scanf("%d",&num);
    fflush(stdin);
    return num;
}

using namespace std;

int main()
{
int menu,num,sust;       //para la tomar recursiva
lista L,L2,Inter;

Crear(L);
Crear(L2);
Crear(Inter);

    printf("\nIngrese los elementos de la Lista:\n");
    IngresaListaBack(L);

    system("cls");

    do{

        printf("\nLista:\n");
        PrintLista(L);

        DesplegaMenu();

        printf("\n\nIngrese opcion de menu: ");
        scanf("%d",&menu);
        printf("\n");
        fflush(stdin);





           switch(menu){
            case 1:
                num=Ingreso();
                printf("\n\nResultado Iterativo:\n");
                if(Pertenece(L,num))
                    printf("    El elemento pertenece a la lista\n");
                else
                    printf("    El elemento NO pertenece a la lista\n");

                printf("\nResultado Recursivo:\n");
                if(PerteneceR(L,num))
                    printf("    El elemento pertenece a la lista");
                else
                    printf("    El elemento NO pertenece a la lista");
                PressEnter();
                break;
            case 2:
                printf("Sustituir el numero...");
                num=Ingreso();

                while(!PerteneceR(L,num)){
                    printf("El entero a sustituir debe pertenecer a la lista\n");
                    num=Ingreso();
                }

                printf("Por el numero...");
                sust=Ingreso();

                while(PerteneceR(L,sust)){
                    printf("El entero ingresado ya pertenece a la lista, los enteros deben ser distintos\n");
                    sust=Ingreso();
                }

                Sustituir(L, num, sust);

                printf("\n\nSe actualizo Lista, continue para visualizar");

                PressEnter();
                break;
            case 3:
                printf("\nIngrese Segunda Lista a comparar:\n");
                IngresaListaBack(L2);

                printf("\n\nResultado Iterativo:\n");

                if(Iguales(L,L2))
                    printf("    Las Listas son Iguales");
                else
                    printf("    Las listas son Distintas");

                printf("\n\nResultado Recursivo:\n");
                if(IgualesR(L,L2))
                    printf("    Las Listas son Iguales");
                else
                    printf("    Las listas son Distintas");

                EliminarTodos(L2);
                PressEnter();
                break;
            case 4:
                printf("\nIngrese Segunda Lista a intersectar:\n");
                IngresaListaBack(L2);

                Interseccion(L,L2,Inter);

                if(Inter!=NULL){
                    printf("\nLista Interseccion:\n");
                    PrintLista(Inter);

                    EliminarTodos(Inter);
                }
                else
                    printf("\nLas listas no se intersectan");

                EliminarTodos(L2);
                PressEnter();
                break;
            case 5:
                printf("\nResultado de la suma: %li",SumaPares(L));         //Poner en la documentacion porque long int

                PressEnter();
                break;
            case 6:
                EliminarTodos(L);
                printf("Ingrese los nuevos valores de la lista:\n");
                IngresaListaBack(L);
                printf("Se actualizo Lista, continue para visualizar");
                PressEnter();
                break;
            case 7:

                printf("\nMinimo elemento de la lista: %d",MinimoR(L));

                PressEnter();
                break;
            case 8:
                num=Ingreso();
                if(num>Largo(L)||num<1)
                    printf("La posicion indicada no existe en la lista");
                else
                    printf("\nEl elemento de la posicion %d es: %d",num,NesimoR(L,num));
                PressEnter();
                break;
            case 9:
                printf("Ingrese elemento a eliminar");
                num=Ingreso();
                if(Pertenece(L,num)){
                    Borrar(L, num);
                    printf("Borrado Iterativo.\nSe actualizo Lista, continue para visualizar");
                }else
                    printf("    El elemento NO pertenece a la lista\n");
                PressEnter();
                break;
            case 10:
                printf("Ingrese elemento a eliminar");
                num=Ingreso();
                if(Pertenece(L,num)){
                    BorrarR(L, num);
                    printf("Borrado Recursivo.\nSe actualizo Lista, continue para visualizar");
                }else
                    printf("    El elemento NO pertenece a la lista\n");

                PressEnter();
                break;
            case 11:
                num=Ingreso();
                if(num>Largo(L)||num<1)
                    printf("Cantidad incorrecta de elementos a visualizar");
                else{
                    printf("\n\nResultado Iterativo:\n");
                    Tomar(L, num, L2);
                    printf("\nLos primeros elementos seleccionados de la lista son:\n");
                    PrintLista(L2);
                    EliminarTodos(L2);

                    printf("\n\nResultado Recursivo:\n");
                    TomarR(L, num, L2);
                    printf("\nLos primeros elementos seleccionados de la lista son:\n");
                    PrintLista(L2);
                    EliminarTodos(L2);
                }

                PressEnter();
                break;
            case 12:

                break;

            default:
                printf ("          Opcion incorrecta de Menu, ingrese opcion correcta");
                PressEnter();
        }
    system("cls");
   }while(menu!=12);

    return 0;
}
